Computer systems may contain multiple processors that may work together to perform a task. For example, a computer system may contain four processors that may share system resources (e.g., input devices or memory devices) and may perform parallel processing. The processors may send messages to each other, may send messages to system resources, and may receive messages from the system resources. For example, such messages may include requests for information that is stored at a location in a memory device (i.e., read requests) or a request to store information in a location of a memory device (i.e., write requests).
The processors may share multiple system resources (e.g., memory) and multiple independent paths to these system resources for exchanging messages and requests. In some cases, the existence of these distributed resources and paths may result in reordering of messages or requests in a multi-node architecture. For example, a first processor may issue write requests for updating data to a memory address location in another node. However, before the request is completed, if a second processor issues another request to read data from the memory address location, the second processor may read data that is “stale” or has become outdated. This situation becomes complicated in a multiple node architecture having distributed memory resources.
For example, consider a case where memory locations “A” and “B” in a memory resource have initial conditions or values of “10” and “False,” respectively (i.e., A=10 and B=“False”). Agent A such as a node controller of one of the processor nodes in the multi-node architecture may issue requests to write to memory locations A and B in the memory resource located, for example, in another node. Such requests may be, for example, “WR A=20” (i.e., write to location A the value 20) followed by “WR B=True” (i.e., write to location B the value True). Before the write requests issued by Agent A are executed, Agent B such as a node controller of another processor node may issue a request to the same memory location such as “if (B=True) RD A” (i.e., if the value of location B is True, then read the value of location A). If the receiving agent containing the memory resource receives and executes “WR B=True” from Agent A before “WR A=20” from Agent A and the requests issued by Agent B (“if (B=True) RD A”) are executed before “WR A=20” request from Agent A, then Agent B may not receive the correct value of location A since the value of location B has been updated but the value of location A is not updated.